using System;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;
using System.Runtime.Serialization;

namespace FU.Capstones.IMS.Web.Common.InventoryServiceProxy.DataContracts
{
    [KnownType(typeof(EmployeeCriteria))]
    [DataContract(Namespace = WebConstants.ServiceNamespace)]
    public class Employee : BindingModelBase<Employee>
    {
        public Employee()
        {
            AddAllAttributeValidators();
            AddValidationFor(() => DateOfBirth)
                .When(x => x.DateOfBirth.Year < DateTime.Now.Year - 60 || x.DateOfBirth.Year > DateTime.Now.Year - 18)
                .Show("Tuổi của nhân viên phải nằm trong khoảng từ 18 tới 60.");
            AddValidationFor(() => JoinedDate)
                .When(x => x.JoinedDate.CompareTo(DateTime.Now) > 0)
                .Show("Ngày vào công ty không được sau ngày hiện tại");
            AddValidationFor(() => JoinedDate)
                .When(x => x.JoinedDate.Year - x.DateOfBirth.Year < 19)
                .Show("Ngày vào công ty và ngày sinh chưa phù hợp.");
        }

        private int employeeID;
        [Key]
        [DataMember]
        public int EmployeeID
        {
            get { return employeeID; }
            set
            {
                if(!Equals(employeeID, value))
                {
                    employeeID = value;
                    RaisePropertyChanged(() => EmployeeID);
                }
            }
        }

        private string fullName;
        [DataMember]
        [Required(AllowEmptyStrings = false, ErrorMessage = "Tên không được bỏ trống!")]
        [StringLength(50, ErrorMessage = "Tên không được dài quá 50 kí tự!")]
        [Display(Name = "Họ và tên")]
        public string FullName
        {
            get { return fullName; }
            set
            {
                if(!ReferenceEquals(fullName, value))
                {
                    fullName = value;
                    RaisePropertyChanged(() => FullName);
                }
            }
        }

        public string FullNameSearch
        {
            get { return fullName; }
            set
            {
                if (!ReferenceEquals(fullName, value))
                {
                    fullName = value;
                    RaisePropertyChanged(() => FullNameSearch);
                }
            }
        }

        private DateTime dateOfBirth;
        [DataMember]
        [Required(AllowEmptyStrings = false, ErrorMessage = "Ngày sinh không được bỏ trống!")]
        [Display(Name = "Ngày sinh")]
        public DateTime DateOfBirth
        {
            get { return dateOfBirth; }
            set
            {
                if(!Equals(dateOfBirth,value))
                {
                    dateOfBirth = value;
                    RaisePropertyChanged(() => DateOfBirth);
                }
            }
        }

        private DateTime joinedDate;
        [DataMember]
        [Required(AllowEmptyStrings = false, ErrorMessage = "Ngày kí hợp đồng không được bỏ trống!")]
        [Display(Name = "Ngày vào công ty")]
        public DateTime JoinedDate
        {
            get { return joinedDate; }
            set
            {
                if (!Equals(joinedDate, value))
                {
                    joinedDate = value;
                    RaisePropertyChanged(() => JoinedDate);
                }
            }
        }

        private string identityCardNumber;
        [DataMember]
        [Required(AllowEmptyStrings = false, ErrorMessage = "Số CMT không được bỏ trống!")]
        [StringLength(9, ErrorMessage = "Số CMT không dài quá 9 chữ số")]
        [RegularExpression(WebConstants.ICNRegex, ErrorMessage = "Số CMT phải có chính xác 9 chữ số.")]
        [Display(Name = "Số CMT")]
        public string IdentityCardNumber
        {
            get { return identityCardNumber; }
            set
            {
                if(!Equals(identityCardNumber, value))
                {
                    identityCardNumber = value;
                    RaisePropertyChanged(() => IdentityCardNumber);
                }
            }
        }

        private string email;
        [DataMember]
        [StringLength(50, ErrorMessage = "Địa chỉ thư điện tử không dài quá 50 kí tự!")]
        [RegularExpression(WebConstants.EmailRegex, ErrorMessage="Thư điện tử không đúng định dạng. Ví dụ: kan.vuduc@gmail.com")]
        [Display(Name = "Thư điện tử")]
        public string Email
        {
            get { return email; }
            set
            {
                if(!ReferenceEquals(email, value))
                {
                    email = value;
                    RaisePropertyChanged(() => Email);
                }
            }
        }

        private EmploymentType employmentType;
        [DataMember]
        [Required(ErrorMessage = "Loại tuyển dụng không được bỏ trống!")]
        [Display(Name = "Loại tuyển dụng")]
        public EmploymentType EmploymentType
        {
            get { return employmentType; }
            set
            {
                if(!ReferenceEquals(employmentType,value))
                {
                    employmentType = value;
                    RaisePropertyChanged(() => EmploymentType);
                }
            }
        }

        private string address;
        [DataMember]
        [Required(ErrorMessage = "Địa chỉ liên hệ không được bỏ trống!")]
        [Display(Name = "Địa chỉ")]
        public string Address
        {
            get { return address; }
            set
            {
                if(!ReferenceEquals(address,value))
                {
                    address = value;
                    RaisePropertyChanged(() => Address);
                }
            }
        }

        private string phoneNumber;
        [DataMember]
        [StringLength(20, ErrorMessage = "Số điện thoại nhà không dài quá 20 kí tự!")]
        [Display(Name = "Số điện thoại nhà")]
        public string PhoneNumber
        {
            get { return phoneNumber; }
            set
            {
                if(!ReferenceEquals(phoneNumber,value))
                {
                    phoneNumber = value;
                    RaisePropertyChanged(() => PhoneNumber);
                }
            }
        }

        private string mobileNumber;
        [DataMember]
        [StringLength(20, ErrorMessage = "Số điện thoại di động không dài quá 20 kí tự!")]
        [Display(Name = "Số di động")]
        public string MobileNumber
        {
            get { return mobileNumber; }
            set
            {
                if (!ReferenceEquals(mobileNumber, value))
                {
                    mobileNumber = value;
                    RaisePropertyChanged(() => MobileNumber);
                }
            }
        }

        private string description;
        [DataMember]
        public string Description
        {
            get { return description; }
            set
            {
                if(!ReferenceEquals(description, value))
                {
                    description = value;
                    RaisePropertyChanged(() => Description);
                }
            }
        }

        private Role role;
        [DataMember]
        [Required(ErrorMessage = "Chức vụ không được bỏ trống!")]
        [Display(Name = "Chức vụ")]
        public Role Role
        {
            get { return role; }
            set
            {
                if (!ReferenceEquals(role, value))
                {
                    role = value;
                    RaisePropertyChanged(() => Role);
                }
            }
        }
        
        private string gender;
        [DataMember]
        [Required(ErrorMessage = "Giới tính không được bỏ trống!")]
        [Display(Name = "Giới tính")]
        public string Gender
        {
            get { return gender; }
            set
            {
                if (!ReferenceEquals(gender, value))
                {
                    gender = value;
                    RaisePropertyChanged(() => Gender);
                }
            }
        }

        private string username;
        [DataMember]
        [Required(ErrorMessage = "Tên đăng nhập không được bỏ trống!")]
        [StringLength(50, ErrorMessage = "Tên đăng nhập không dài quá 50 kí tự!")]
        [RegularExpression(WebConstants.UsernameRegex, ErrorMessage = "Tên đang nhập phải bao gồm ít nhất 4 chữ cái latin và có thể thêm các chữ số ở cuối. Ví dụ: user12")]
        [Display(Name = "Tên đăng nhập")]
        public string Username
        {
            get { return username; }
            set
            {
                if(!ReferenceEquals(value, username))
                {
                    username = value;
                    RaisePropertyChanged(()=>Username);
                }
            }
        }

        private ObservableCollection<int> authorizationCollection;
        [DataMember]
        public ObservableCollection<int> AuthorizationCollection
        {
            get { return authorizationCollection; }
            set
            {
                if (!ReferenceEquals(authorizationCollection, value))
                {
                    authorizationCollection = value;
                    RaisePropertyChanged(() => AuthorizationCollection);
                }
            }
        }
        
        private bool isDelete;
        [DataMember]
        public bool IsDelete
        {
            get { return isDelete; }
            set
            {
                if (!ReferenceEquals(value, isDelete))
                {
                    isDelete = value;
                    RaisePropertyChanged(() => IsDelete);
                }
            }
        }
    }
}
